<?php
include_once($_SERVER['DOCUMENT_ROOT'] . '/sandbox/modelos/m_vendedor.php');
include_once($_SERVER['DOCUMENT_ROOT'] . '/sandbox/modelos/m_venda.php');
include_once($_SERVER['DOCUMENT_ROOT'] . '/sandbox/modelos/m_item.php');
include_once($_SERVER['DOCUMENT_ROOT'] . '/sandbox/modelos/m_logging.php');

// Carrega o e-mail e o token
// Verifica se é POST ou XML e joga o conteudo em um array desejado.
// Obs.: Neste momento, nao irei me preocupar com charset (24/09/2011)
$tipoConteudo = explode(";", $_SERVER['CONTENT_TYPE']);
$entrada = file_get_contents('php://input');

if ($tipoConteudo[0] == 'application/xml') {
	$email = $_GET['email'];
	$token = $_GET['token'];
	$transacao = simplexml_load_string($entrada);
	$tipoArq = "XML";
} elseif($tipoConteudo[0] == 'application/x-www-form-urlencoded') {
	parse_str($entrada, $trans);
	// Converter o array $trans para ficar igual ao $transacao
	$transacao = array_to_object($trans);	
	$email = $transacao->email;
	$token = $transacao->token;
	$tipoArq = "URLEncoded";
} else {
	// Se não for URLEncoded nem XML, tem que parar (não é nenhum tipo pré-definido)
	//print_r('Erro: Nao eh um tipo predefinido');
	die();	
}

//Cria o objeto Vendedor
$vendedor = new Vendedor;
//Busca o ID do vendedor pelo e-mail e token
$vendedor->busca_id($email, $token);
//Se não achar, interromper a execução
if (empty($vendedor->id)) {
	print_r('Unauthorized');
	die();
}

$venda = new Venda;
$agora = date("Y-m-d\\TH:i:s.000P");

$campos = "DtCriacao, Situacao, IdVendedor, Moeda, Referencia, Acrescimo,
					NomeComprador, DDD, Telefone, EmailComprador,
					TipoEnvio, Rua, Numero, Complemento, Bairro, CEP, Cidade, UF, Pais,
					URLRedirecionamento, maxAge, maxUses";
					
if ($tipoArq == 'XML') {
	$venda->adiciona($vendedor->id, $transacao->shipping->type, $transacao->currency, $transacao->reference,
						(isset($transacao->extraAmount) ? $transacao->extraAmount : '0.00'), $transacao->sender->name,
						$transacao->sender->phone->areaCode, $transacao->sender->phone->number, $transacao->sender->email,
						$transacao->shipping->address->street, $transacao->shipping->address->number,
						$transacao->shipping->address->complement, $transacao->shipping->address->district,
						$transacao->shipping->address->postalCode, $transacao->shipping->address->city, $transacao->shipping->address->state,
						$transacao->shipping->address->country, $agora, $transacao->redirectURL,
						(isset($transacao->maxAge) ? $transacao->maxAge : 'NULL'), (isset($transacao->maxUses) ? $transacao->maxUses : 'NULL'),
						strtoupper(md5(uniqid())));
} elseif ($tipoArq == 'URLEncoded') {
	$venda->adiciona($vendedor->id, $transacao->shippingType, $transacao->currency, $transacao->reference,
						(isset($transacao->extraAmount) ? $transacao->extraAmount : '0.00'), $transacao->senderName,
						$transacao->senderAreaCode, $transacao->senderPhone, $transacao->senderEmail,
						$transacao->shippingAddressStreet, $transacao->shippingAddressNumber,
						$transacao->shippingAddressComplement, $transacao->shippingAddressDistrict,
						$transacao->shippingAddressPostalCode, $transacao->shippingAddressCity, $transacao->shippingAddressState,
						$transacao->shippingAddressCountry, $agora, (isset($transacao->redirectURL) ? $transacao->redirectURL : ''),
						(isset($transacao->maxAge) ? $transacao->maxAge : 'NULL'), (isset($transacao->maxUses) ? $transacao->maxUses : 'NULL'),
						strtoupper(md5(uniqid())));
}

$objitem = new Item($venda->id_venda);

if ($tipoArq == "XML") {
	// Varrer os itens dentro da transacao
	foreach ($transacao->items->item as $item) {
		// Usa o INSERT preparado
		$objitem->adiciona((string) $item->id, (string) $item->description, (string) $item->amount, 
							(string) $item->quantity, (isset($item->weight) ? (string) $item->weight : ''),
							(isset($item->shippingCost) ? (string) $item->shippingCost : ''));
	}
} elseif ($tipoArq == "URLEncoded") {
	// Buscar os itens até 25?
	$i = 1;
	$elem = Array('itemId' . $i, 'itemDescription' . $i, 'itemAmount' . $i, 'itemQuantity' . $i, 'itemWeight' . $i, 'itemShippingCost' . $i);
	do {
		//print_r("<BR>" . $transacao->$elem[0]);
		// Usa o INSERT preparado
		$objitem->adiciona($transacao->$elem[0], $transacao->$elem[1], $transacao->$elem[2], 
							$transacao->$elem[3], (isset($transacao->$elem[4]) ? $transacao->$elem[4] : ''),
							(isset($transacao->$elem[5]) ? $transacao->$elem[5] : ''));
		$elem = null;
		$i++;
		$elem = Array('itemId' . $i, 'itemDescription' . $i, 'itemAmount' . $i, 'itemQuantity' . $i, 'itemWeight' . $i, 'itemShippingCost' . $i);
	} while(isset($transacao->$elem[0]));
}

// Pronto! Tudo foi para o banco. Agora é retornar ao usuário qual é o ID da transação.
$retorno = '<?xml version="1.0" encoding="ISO-8859-1"?>';
$retorno .= '<checkout>';
$retorno .= '<code>' . $venda->txt_codigo_pagamento . '</code>';
$retorno .= '<date>' . $agora . '</date>';
$retorno .= '</checkout>';
echo($retorno);
	
// Seção de funções

// 1. Função para converter um array em um objeto
function array_to_object($array = array()) {
	$log = new Logging('mylog.log');

    if (!empty($array)) {
        $data = new stdClass();
        foreach ($array as $akey => $aval) {
			$log->lwrite($akey . ' - ' . trim($aval));
            $data -> {$akey} = trim($aval);
        }
        return $data;
    }
    return false;
}
?>